#include "app_modbus.h"

modbus_t *modbus;
gate_status_t app_modbus_init(void)
{
    if (modbus)
    {
        return OK;
    }
    // 1. 创建modbus上下文
    modbus = modbus_new_rtu("/dev/ttyS1", 115200, 'N', 8, 1);

    if (modbus == NULL)
    {
        log_error("创建modbus上下文失败");

        return ERROR;
    }

    // 2. 启用调试模式(生产环境最好关闭)
    modbus_set_debug(modbus, TRUE);

    // 3. 建立moddbus连接 (其实是打开串口)
    if (modbus_connect(modbus) == -1)
    {
        log_error("建立modbus连接失败");

        return ERROR;
    }
    return OK;
}

void app_modbus_deInit(void)
{
    modbus_close(modbus);
    modbus_free(modbus);
}

/**
 * @brief 写单个保持寄存器
 *
 * @param slaveAddr 从站地址
 * @param value 值 (寄存器地址固定写死 0)
 */
gate_status_t app_modbus_writeSingleHoldRegister(uint8_t slaveAddr, uint16_t value)
{
    // 1. 设置从机地址
    modbus_set_slave(modbus, slaveAddr);

    // 2. 发送数据
    int err = modbus_write_register(modbus, 0, value);
    if (err == -1)
    {
        log_error("发送数据失败");
        return ERROR;
    }
    return OK;
}

gate_status_t app_modbus_readSigleInputRegister(uint8_t slaveAddr, uint16_t *value)
{
    // 1. 设置从机地址
    modbus_set_slave(modbus, slaveAddr);

    // 2. 读取数据  参数2: 寄存器地址 参数3: 读取的寄存器数量 参数4: 存放读取数据的指针
    int err = modbus_read_input_registers(modbus, 0, 1, value);
    if (err == -1)
    {
        log_error("读取数据失败");
        return ERROR;
    }
    return OK;
}
